package n_12;


/**
 * @author ChengMiao
 * @title: Demo
 * @projectName leet-code-record
 * @description: 12.整数转罗马数字
 * 罗马数字 2 写做II，即为两个并列的 1。12 写做II，即为X+II。 27 写做XXVII, 即为XX+V+II。
 * <p>
 * 通常情况下，罗马数字中小的数字在大的数字的右边。但也存在特例，例如 4 不写做IIII，而是IV。数字 1 在数字 5 的左边，所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地，数字 9 表示为IX。这个特殊的规则只适用于以下六种情况：
 * <p>
 * I可以放在V(5) 和X(10) 的左边，来表示 4 和 9。
 * X可以放在L(50) 和C(100) 的左边，来表示 40 和90。
 * C可以放在D(500) 和M(1000) 的左边，来表示400 和900。
 * 给你一个整数，将其转为罗马数字。
 * @date 2023/4/20 11:15
 */
public class Demo {

    public static void main(String[] args) {


        System.out.println(intToRoman(3999));
    }

    public static String intToRoman(int num) {
        /**
         * I             1
         * V             5
         * X             10
         * L             50
         * C             100
         * D             500
         * M             1000
         *
         *  I
         *  II
         *  III
         *  IV
         *  V
         *  VI
         *  VII
         *  VIII
         *  IX
         *  X
         */

        String result = new String();



        if (num >= 1000) {
            // [1000,+oo]
            result = convertLess(num);

        } else if (num >= 500) {
            // [500,1000]
            result = convertLess1000(num);

        } else if (num >= 100) {
            // [100,500]
            result = convertLess500(num);

        } else if (num >= 50) {
            // [50,100]
            result = convertLess100(num);
        } else if (num >= 10) {
            // [10,50]
            result = convertLess50(num);
        } else if (num >= 5) {
            // [5,10]
            result = convertLess10(num);
        } else if (num >= 1) {
            // [1,5]
            result = convertLess5(num);
        }


        return result.toString();


    }

    public static String convertLess(int num) {
        StringBuilder result = new StringBuilder();

        int s = num % 1000;
        int k = num / 1000;
        if (k > 0) {

            for (int i = 0; i < k; i++) {
                result.append("M");
            }

            result.append(convertLess1000(s));
        } else {
            result.append(convertLess1000(s));

        }


        return result.toString();
    }

    public static String convertLess1000(int num) {
        StringBuilder result = new StringBuilder();

        int s = num % 500;
        int k = num / 500;
        if (k > 0) {
            result.append("D");
            if (s >= 400) {
                result = new StringBuilder("CM");
                result.append(convertLess100(s - 400));
            }else{
                result.append(convertLess500(s));
            }
        } else {
            result.append(convertLess500(s));
        }


        return result.toString();
    }

    public static String convertLess500(int num) {
        StringBuilder result = new StringBuilder();

        int s = num % 100;
        int k = num / 100;
        if (k > 0) {
            for (int i = 0; i < k; i++) {
                result.append("C");
            }
            if (k >= 4) {
                result = new StringBuilder("CD");
            }
            result.append(convertLess100(s));

        } else {
            result.append(convertLess100(s));
        }


        return result.toString();
    }

    public static String convertLess100(int num) {
        StringBuilder result = new StringBuilder();

        int s = num % 50;
        int k = num / 50;
        if (k > 0) {
            result.append("L");
            if (s >= 40) {
                result = new StringBuilder("XC");
                result.append(convertLess10(s - 40));
            }else{
                result.append(convertLess50(s));

            }
        } else {
            result.append(convertLess50(s));
        }


        return result.toString();
    }

    public static String convertLess50(int num) {

        StringBuilder result = new StringBuilder();
        int k = num / 10;
        int s = num % 10;

        if (k < 4) {
            for (int i = 0; i < k; i++) {
                result.append("X");
            }
        } else {
            result.append("XL");
        }


        result.append(convertLess10(s));


        return result.toString();
    }

    public static String convertLess10(int num) {
        StringBuilder result = new StringBuilder();
        int s = num % 5;
        int k = num / 5;
        if (k > 0) {
//            if( s<=4){
            result.append("V");
//            }

            for (int i = 1; i <= s; i++) {

                if (i < 4) {
                    result.append("I");
                } else {
                    if(k>0){
                        result = new StringBuilder("IX");
                    }
                }
            }
        }else{
            return convertLess5(num);
        }




        return result.toString();
    }

    public static String convertLess5(int num) {
        StringBuilder result = new StringBuilder();
        for (int i = 1; i <= num; i++) {
            if (i < 4) {
                result.append("I");
            } else {
                result = new StringBuilder("IV");
            }
        }

        return result.toString();
    }
}
